#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>

using namespace std;
int n,m,k,l,o,p,tp,maxn,ans,zt;

long long zh[30][30];
long long jy[300][300];

bool mop[300][300];
char du[1010];

int pd(int hp,int sp)
{
    //走到这里更优就继续
	if(zt<jy[hp][sp])
    {
        jy[hp][sp]=zt;
        return 1;
    }

    //如果之前有了更短的路就停
    return 0;
}

void dfs(int fh,int fs)
{
    //最优化剪枝
	if(zt>ans)
        return; 

	if(!pd(fh,fs))return ;//记忆化搜索
	if(fh==o&&fs==p)
	{
		ans=min(ans,zt);
		tp=1;
	}//记录答案

	//下面是浩浩荡荡的dfs大军
	if(!mop[fh+1][fs])
	{
		zt++;
		mop[fh+1][fs]=1;
		dfs(fh+1,fs);
		zt--;
		mop[fh+1][fs]=0; 
	}

	if(!mop[fh][fs+1])
	{
		zt++;
		mop[fh][fs+1]=1;
		dfs(fh,fs+1);
		zt--;
		mop[fh][fs+1]=0;
	}

	if(!mop[fh-1][fs])
	{
		zt++;
		mop[fh-1][fs]=1;
		dfs(fh-1,fs);
		zt--;
		mop[fh-1][fs]=0;
 	}

	if(!mop[fh][fs-1])
	{
		zt++;
		mop[fh][fs-1]=1;
		dfs(fh,fs-1);
		zt--;
		mop[fh][fs-1]=0;
	}
}

int main()
{
	while(1)
	{
		scanf("%d%d",&m,&n);
		if(m==0 || n==0)
			break;//终止

		memset(mop,0,sizeof(mop));
		memset(du, 0,sizeof(du) );
		memset(zh, 0,sizeof(zh) );

		for(int yyy=1;yyy<=299;yyy++)
		{
			for(int yuu=1;yuu<=299;yuu++)
			{
				jy[yyy][yuu]=99999;
			}
		}

		//回溯
		ans=999999;
		tp=0;
		k=0;
		l=0;
		o=0;
		p=0;
		zt=0;

		//封周边
		for(int i=0;i<=n+m;i++)
		{
				mop[0][i]=1;
				mop[n+1][i]=1;
				mop[i][0]=1;
				mop[i][m+1]=1;
		}

		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
			{
				//读入数据
				scanf("\n%c",&du[j]);
				if(du[j]=='#')
					mop[j][i]=1;

				if(du[j]=='@')
				{
					k=j;
					l=i;
				}

				if(du[j]=='*')
				{
					o=j;
					p=i;
				}
			}
		}

		dfs(k,l);

		if(!tp)
			printf("-1\n");

		if(tp)
			printf("%d\n",ans);
	}

	return 0;
}